package com.zhuangjie.shop.dto;

import com.alibaba.fastjson.annotation.JSONField;
import com.zhaungjie.base.utils.MD5Utils;
import com.zhuangjie.shop.entity.CartDishFlavor;
import lombok.Data;
import org.apache.logging.log4j.util.Strings;

import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 购物车项目（选择的菜品）
 *
 * @author zhuangjie
 * @date 2023/10/30
 */
@Data
public class CartItemDTO {
    // 店铺id
    @NotNull(message = "店铺id不能为空")
    private Long shopId;
    // 菜品id
    @NotNull(message = "菜品id不能为空")
    private Long id;
    @NotNull(message = "数量不能为空")
    private Integer count;
    // 选择的口味项
    private List<CartDishFlavor> flavors;
    // 该菜品总价（结合了选择的口味增值） = 口味菜品价格*count
    private BigDecimal price;

    // 获取当前规格的唯一id
    @JSONField(serialize = false) // 自定义以getXXX setXX开头，fastJson序列化会调用
    public String genDishSpecificationKey() {
        String plaintext = String.valueOf(id)+"::";
        if(flavors != null && ! flavors.isEmpty()) {
            // 根据id排序（强制）
            flavors.sort((item1,item2)-> Math.toIntExact(item1.getId() - item2.getId()));
            for (CartDishFlavor flavor : flavors) {
                plaintext += (flavor.getId() + flavor.getName());
            }
        }
        // 对plaintext进行MD5
        return MD5Utils.md5(plaintext);
    }

    /**
     * 获取餐具规格str(枚举文字描述，比如‘加辣,大份’)
     *
     * @return {@link String}
     */
    @JSONField(serialize = false)
    public String genDishSpecificationStr() {
        if (this.flavors == null) return null;
        return Strings.join(this.flavors.stream().map(flavor->flavor.getName()).collect(Collectors.toList()), ',');
    }

}
